{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "sys.path.append(\"/usr/local/lib/python3.8/site-packages\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import meep as mp\n",
    "from autograd import numpy as npa\n",
    "import meep.adjoint as mpa\n",
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "mp.quiet(quietval=True)\n",
    "\n",
    "seed = 240\n",
    "np.random.seed(seed)\n",
    "\n",
    "resolution = 20\n",
    "\n",
    "Sx = 5\n",
    "Sy = 5\n",
    "sxy = 5\n",
    "cell_size = mp.Vector3(Sx,Sy)\n",
    "\n",
    "pml_layers = [mp.PML(1.0)]\n",
    "\n",
    "fcen = 1/1.55\n",
    "width = 0.2\n",
    "fwidth = width * fcen\n",
    "source_center  = [0,-1,0]\n",
    "source_size    = mp.Vector3(0,0,0)\n",
    "src = mp.GaussianSource(frequency=fcen,fwidth=fwidth)\n",
    "\n",
    "source = [mp.Source(src,component=mp.Ex,\n",
    "                    size = source_size,\n",
    "                    center=source_center)]\n",
    "\n",
    "\n",
    "design_region_resolution = 10\n",
    "\n",
    "Nx = design_region_resolution//2\n",
    "Ny = design_region_resolution//2\n",
    "\n",
    "Si = mp.Medium(index=3.4)\n",
    "SiO2 = mp.Medium(index=1.44)\n",
    "\n",
    "design_variables = mp.MaterialGrid(mp.Vector3(Nx,Ny),SiO2,Si,grid_type='U_SUM')\n",
    "design_region = mpa.DesignRegion(design_variables,volume=mp.Volume(center=mp.Vector3(), size=mp.Vector3(0.5, 0.5, 0)))\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "geometry = [\n",
    "    mp.Block(center=design_region.center, size=design_region.size, material=design_variables)# design region\n",
    "]\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "sim = mp.Simulation(cell_size=cell_size,\n",
    "                    boundary_layers=pml_layers,\n",
    "                    geometry=geometry,\n",
    "                    sources=source,\n",
    "                    eps_averaging=False,\n",
    "                    resolution=resolution)\n",
    "\n",
    "far_x = mp.Vector3(2000, 2000, 0)\n",
    "NearRegions = [mp.Near2FarRegion(center=mp.Vector3(0,+0.125*sxy), size=mp.Vector3(0.55*sxy,0), weight=+1)]\n",
    "\n",
    "\n",
    "Far0 = mpa.Near2FarFields(sim, NearRegions ,far_x)\n",
    "\n",
    "\n",
    "ob_list = [Far0]\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "def J2(alpha):\n",
    "    return npa.abs(alpha[0,0])**2 + npa.abs(alpha[1,5])**3\n",
    "\n",
    "\n",
    "def J1(alpha):\n",
    "    return npa.abs(alpha[0,0])**2\n",
    "\n",
    "\n",
    "def J3(alpha):\n",
    "    return npa.abs(alpha[0,0])**2 + npa.abs(alpha[0,5])**3\n",
    "\n",
    "def J4(alpha):\n",
    "    return npa.abs(alpha[0,2])**2 + npa.abs(alpha[1,3])**3\n",
    "\n",
    "x0 = 11*np.random.rand(Nx*Ny) + 1\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting forward run...\n",
      "Starting adjoint run...\n",
      "Calculating gradient...\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "opt = mpa.OptimizationProblem(\n",
    "    simulation=sim,\n",
    "    objective_functions=J3,\n",
    "    objective_arguments=ob_list,\n",
    "    design_regions=[design_region],\n",
    "    fcen=fcen,\n",
    "    df = 0,\n",
    "    nf = 1,\n",
    "    decay_fields=[mp.Ex],\n",
    "    decay_by=2e-5\n",
    ")\n",
    "\n",
    "\n",
    "opt.update_design([x0])\n",
    "\n",
    "\n",
    "f0, dJ_deps = opt()\n",
    "\n",
    "\n",
    "\n",
    "db = 1e-3\n",
    "choose = 10\n",
    "\n",
    "g_discrete, idx = opt.calculate_fd_gradient(num_gradients=choose,db=db)\n",
    "g_discrete = np.array(g_discrete)\n",
    "\n",
    "g_adjoint = dJ_deps\n",
    "\n",
    "(m, b) = np.polyfit(np.squeeze(g_discrete), g_adjoint[idx], 1)\n",
    "min_g = np.min(g_discrete)\n",
    "max_g = np.max(g_discrete)\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "fig, ax1 = plt.subplots()\n",
    "\n",
    "ax1.plot([min_g, max_g],[min_g, max_g],label='y=x comparison')\n",
    "ax1.plot([min_g, max_g],[m*min_g+b, m*max_g+b],'--',label='Best fit m='+str(m))\n",
    "ax1.plot(g_discrete,g_adjoint[idx],'o',label='Adjoint comparison')\n",
    "ax1.set_xlabel('Finite Difference Gradient')\n",
    "ax1.set_ylabel('Adjoint Gradient')\n",
    "ax1.tick_params(axis='y')\n",
    "plt.legend()\n",
    "plt.grid(True)\n",
    "\n",
    "\n",
    "g_discrete = g_discrete.reshape(-1, 1)\n",
    "g_adjoint = g_adjoint.reshape(-1,1)\n",
    "ax2 = ax1.twinx()\n",
    "ax2.plot(g_discrete, np.abs((g_discrete-g_adjoint[idx])/g_discrete),'^',label='Relative error')\n",
    "ax2.set_ylabel('Relative error')\n",
    "ax2.tick_params(axis='y')\n",
    "\n",
    "\n",
    "\n",
    "plt.title('Resolution: {}'.format(resolution))\n",
    "plt.legend()\n",
    "fig.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting forward run...\n",
      "Starting adjoint run...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.8/site-packages/meep/adjoint/filter_source.py:92: RuntimeWarning: divide by zero encountered in true_divide\n",
      "  l2_err = np.sum(np.abs(H-H_hat.T)**2/np.abs(H)**2)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Calculating gradient...\n"
     ]
    },
    {
     "data": {
      "image/png": "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nTt3XrD9+++/T/v27WnVqhW33HILCQkJrFmzhgULFvD444/TunVr/vjjD0aNGsWcOXNYvHgxgwcPdu8fGRlJv37Ou2SWLFlC586dadOmDYMHD86099wff/yRaUyjRo3i3nvvpWPHjjzxxBOMGjWKsWPH0r5tG5565F7+3LSNYdcP4+ZuN/PwyIc5G30WEeGum+7ikUceoV27dl595xQ3xW4svpy88M02th+JyXab3w6fdbee0iSnKl9tiGL3n7EXbN+8dkX+fmOLLMu76667GDhwII888ggOh4OZM2eydu1aYmNj6dKlS6b7fPHFFzRv3pw333yTUaNGMW7cOM6cOcM999yTbrukpCRuu+02Zs2aRfv27YmJiaF8+fJMmTIFEeG3335j586d9O7dm99//x2ArVu3snHjRhITE2ncuDETJ05k48aNPProo3zyySc88sgjACQkJLBp0yZ++OEH7rrrLrZu3UrTpk1ZtWoVQUFBfP/99zzzzDPMnTsXgA0bNrBlyxaqVq3K/v373TG+8847jBs3juHDh5OUlERqaiq//vorH3/8Mb/88guqSseOHenWrRtVqlRh9+7dzJgxg/fff59bb72VuXPnMmLEiGw/M1MyeF77nbP+EA/3bEyNsIK5Vyk1NZVly5Zx9913AzBu3Djef/99LrvsMn755Rfuv/9+li9fnm6fgQMHuv/mnnvuOT788EMeeugh+vfvT79+/S44jX3ttdcyZswY4uPjCQkJYdasWQwZMoSTJ0/y0ksv8f333xMSEsLEiROZPHky48enHxxnzJgxvPPOO5nGFBUVxZo1awgMDOSOO0ZycO/v/Dz/Pc4HhdKx92BemfwKl7W9jDf+9QbvvvYuU6ZMISggiKSkJNavXw84e/GVJCUuQXnjijqV0r3O7/0S9evXp1q1amzcuJE///yTiIgIqlVzdlvftGlTtvv26tWL2bNn88ADD7B58+YL1u/atYtatWrRvn17ACpWrAjA6tWreeihhwBo2rQp9erVcyeoHj16EBYWRlhYGJUqVeLGG2901vuKK9iyZYu77KFDhwLQtWtXYmJiiI6OJjY2lpEjR7J7925EhOTkv85x9+rVi6pVq14QY+fOnfnnP/9JVFQUAwcO5LLLLmP16tXcfPPNhIQ4e7MOHDiQVatW0b9/fxo0aEDr1q0BaNu2bbpkZ0o2z7MX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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "opt = mpa.OptimizationProblem(\n",
    "    simulation=sim,\n",
    "    objective_functions=J2,\n",
    "    objective_arguments=ob_list,\n",
    "    design_regions=[design_region],\n",
    "    fcen=fcen,\n",
    "    df = 0.03,\n",
    "    nf = 3,\n",
    "    decay_fields=[mp.Ex],\n",
    "    decay_by=2e-5\n",
    ")\n",
    "\n",
    "\n",
    "opt.update_design([x0])\n",
    "\n",
    "\n",
    "f0, dJ_deps = opt()\n",
    "\n",
    "\n",
    "\n",
    "db = 1e-3\n",
    "choose = 10\n",
    "\n",
    "g_discrete, idx = opt.calculate_fd_gradient(num_gradients=choose,db=db)\n",
    "g_discrete = np.array(g_discrete)\n",
    "\n",
    "g_adjoint = np.sum(dJ_deps, axis=1)\n",
    "\n",
    "(m, b) = np.polyfit(np.squeeze(g_discrete), g_adjoint[idx], 1)\n",
    "min_g = np.min(g_discrete)\n",
    "max_g = np.max(g_discrete)\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "fig, ax1 = plt.subplots()\n",
    "\n",
    "ax1.plot([min_g, max_g],[min_g, max_g],label='y=x comparison')\n",
    "ax1.plot([min_g, max_g],[m*min_g+b, m*max_g+b],'--',label='Best fit m='+str(m))\n",
    "ax1.plot(g_discrete,g_adjoint[idx],'o',label='Adjoint comparison')\n",
    "ax1.set_xlabel('Finite Difference Gradient')\n",
    "ax1.set_ylabel('Adjoint Gradient')\n",
    "ax1.tick_params(axis='y')\n",
    "plt.legend()\n",
    "plt.grid(True)\n",
    "\n",
    "\n",
    "g_discrete = g_discrete.reshape(-1, 1)\n",
    "g_adjoint = g_adjoint.reshape(-1,1)\n",
    "ax2 = ax1.twinx()\n",
    "ax2.plot(g_discrete, np.abs((g_discrete-g_adjoint[idx])/g_discrete),'^',label='Relative error')\n",
    "ax2.set_ylabel('Relative error')\n",
    "ax2.tick_params(axis='y')\n",
    "\n",
    "\n",
    "\n",
    "plt.title('Resolution: {}'.format(resolution))\n",
    "plt.legend()\n",
    "fig.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting forward run...\n",
      "Starting adjoint run...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.8/site-packages/meep/adjoint/filter_source.py:92: RuntimeWarning: divide by zero encountered in true_divide\n",
      "  l2_err = np.sum(np.abs(H-H_hat.T)**2/np.abs(H)**2)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Calculating gradient...\n"
     ]
    },
    {
     "data": {
      "image/png": "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xndXcCTW/2vL/kREuOiii7KsJdnnp3DFnI1h+4ntbDq2ie0nthNzNiZTmZzer+KixCQowD5cJcT4hTtYtecE4xfu9HUoRU5OnxH7/BSOmLMxHIw7SFJqEgBJqUkcjDuYbZIqzkpUgjLF35HTiUz7LRpVmL56v9WiTJFzJP4IGdsGqCpH4kveIN6WoEyBOXjwIIMGDcq9YD4av3AHqc6HO0XValHFSGBgIK1btyY8PJzrrruOmJiYHMuPHj2a1157LccyM2fOZPPmvwYmGDVqFD/88EN+hHve0k7rpdWcMspufnFmCcoUiOTkZGrWrMn06dMLbZ9ptaekFFeCSkpRq0X5UH5fCyxbtizr1q1j48aNVK5cmbfffjvP28yYoF544QWuuuqqPG/XG8nJfw3YHHM2hn0x+3JMQqUCSmVar7izBFVIRo0axZtvvumefvbZZxk3blyu6506dYomTZqwbds2AG666Sbeey/zSB+rVq2ic+fORERE0KFDB2JjY0lMTOSOO+6gZcuWREZG8uOPPwIwadIkrr/+enr27EndunWZMGECY8eOJTIykssuu4wTJ04AEBUVxciRI92/WleuXAnAypUr6dSpE5GRkXTu3Nkd2+TJk+nXrx89evTgyiuvZM+ePYSHhwOwadMmOnToQOvWrWnVqhU7duwAYOzYsYSHhxMeHu4+Pnv27KFZs2bcfffdtGjRgl69enHmTO49t3jWntJYLcp3CvJaYKdOnThw4AAAf/zxB71796Zt27Z06dKFrVu3Zir/3nvv0b59eyIiIrjhhhtISEhg+fLlzJo1iyeeeILWrVvzxx9/MHz4cKZPn87cuXMZPHiwe/2lS5dy7bXXAjB//nw6depEmzZtGDx4MHFxcZn2l11Mw4cP57777qNjx448+eST7ulunbvx+ujX2fr7Vm7ufTMDug3gkWGPcCrmFAB39L+DN/75Bu3atfPqe6O4KDHNzD3969tNbD54Ol+32bxmef55XYtsl995550MHDiQv/3tb6SmpvLFF1+wcuVKYmNj6dKlS7qyaR1Tfv755zRv3pwJEyYwfPhwRo4cycmTJ7n77rvTlT937hxDhgxh6tSptG/fntOnT1O2bFnGjRuHiPD777+zdetWevXqxfbt2wHYuHEja9euJTExkYYNG/Lqq6+ydu1aHn30UT755BP+9re/AZCQkMC6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vn2JiIggPDycqVOnMn78eA4ePEj37t3p3r17um2+//77fPnllzz//PPccsst7uEuzp07x6hRo5g6dSqtW7d2d1+UxtvhN3Ize/Zshg4dSpkyZahXrx4NGzZ0D9GR5vjx45QuXZrGjRsDrs5l03pC37x5Mz16uLp2adq0KXv27OHPP/9Mt/7ChQtp0KABderUyTGWcuXKERTkOoOdmJiY5YX9tG1deumlADRr1izLrqBy2lZycjJnzpwhOTmZhIQEatasiaqyaNEid+112LBhzJw5E3B1GtyqVSsCAtJ/9DZv3kxycjI9e/YEIDQ0lHLlyuV4vDxNmTLF3bHvqVOnWLJkibu379KlS1OxYkUAevXq5X4tl112GdHR0TkeR5Newtkkvv7gZaI/vpvQhOsoHZC+Z5bgwGBGthnpo+iKH19fg5oETAA+yWb5NUAj59ER+J/zN+8+6pt5XovrocPdcC4BJg/OvLz1zRB5C8Qfhy9vT7/sjtm57jKtN+bExEQOHTrk7n5//vz57Nixg5UrV6Kq9OnThyVLlnD06FFq1qzJ7NmubZ86dYoKFSowduxYfvzxRy6++OJ02x8xYgTLli1zDx+QdoqodOnSvPDCC6xevZoJEyZkGZs3w2+MGTMmXT9mabp27epOnF27dnXPr127tnvMnjQXX3wxycnJrF69mnbt2jF9+nT2798PQEREBF9//TVdunRh5cqV7N27l+joaKpVq+Ze/4svvnB/EaeZMGECn3zyCe3ateP11193J/5ff/2VO++8k7179/Lpp5+6v5hz2lZ2stpWrVq1ePzxx7n00kspW7YsvXr1olevXhw7doyKFSu695fVccho+/btVKxYkYEDB7J7926uuuoqXnnllRyPV5qEhATmzp3rfm93795NlSpVuOOOO1i/fj1t27Zl3LhxmTob/fDDD0tkD9kXav3mrcR/9SADU1azp1IbBtx5Lwv/bM64NeM4HH+Y6iHVGdlmJH3rZ/HdYi6IT2tQqroEyOnneX/gE6fW+gtQUURqFE50+S+tN+atW7cyd+5cbr/9dlSV+fPnM3/+fCIjI2nTpg3bt29nx44dtGzZkgULFvCPf/yDpUuXUqFChQKLLW34jSpVqmQafiMt0T3xxBOZOrZdt24d48eP93o/IsIXX3zBo48+SocOHQgLC3P3S/jUU08RExND69ateeut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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "source = [mp.Source(src,component=mp.Ez, size = source_size, center=source_center)]\n",
    "\n",
    "sim = mp.Simulation(cell_size=cell_size,\n",
    "                    boundary_layers=pml_layers,\n",
    "                    geometry=geometry,\n",
    "                    sources=source,\n",
    "                    eps_averaging=False,\n",
    "                    resolution=resolution)\n",
    "\n",
    "\n",
    "Far0 = mpa.Near2FarFields(sim, NearRegions ,far_x)\n",
    "\n",
    "\n",
    "ob_list = [Far0]\n",
    "\n",
    "opt = mpa.OptimizationProblem(\n",
    "    simulation=sim,\n",
    "    objective_functions=J4,\n",
    "    objective_arguments=ob_list,\n",
    "    design_regions=[design_region],\n",
    "    fcen=fcen,\n",
    "    df = 0.03,\n",
    "    nf = 3,\n",
    "    decay_fields=[mp.Ez],\n",
    "    decay_by=2e-5\n",
    ")\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "f0, dJ_deps = opt()\n",
    "\n",
    "\n",
    "g_discrete, idx = opt.calculate_fd_gradient(num_gradients=choose,db=db)\n",
    "g_discrete = np.array(g_discrete)\n",
    "\n",
    "g_adjoint = np.sum(dJ_deps, axis=1)\n",
    "\n",
    "\n",
    "(m, b) = np.polyfit(np.squeeze(g_discrete), g_adjoint[idx], 1)\n",
    "min_g = np.min(g_discrete)\n",
    "max_g = np.max(g_discrete)\n",
    "\n",
    "\n",
    "fig, ax1 = plt.subplots()\n",
    "\n",
    "ax1.plot([min_g, max_g],[min_g, max_g],label='y=x comparison')\n",
    "ax1.plot([min_g, max_g],[m*min_g+b, m*max_g+b],'--',label='Best fit m='+str(m))\n",
    "ax1.plot(g_discrete,g_adjoint[idx],'o',label='Adjoint comparison')\n",
    "ax1.set_xlabel('Finite Difference Gradient')\n",
    "ax1.set_ylabel('Adjoint Gradient')\n",
    "ax1.tick_params(axis='y')\n",
    "plt.legend()\n",
    "plt.grid(True)\n",
    "\n",
    "\n",
    "g_discrete = g_discrete.reshape(-1, 1)\n",
    "g_adjoint = g_adjoint.reshape(-1,1)\n",
    "ax2 = ax1.twinx()\n",
    "ax2.plot(g_discrete, np.abs((g_discrete-g_adjoint[idx])/g_discrete),'^',label='Relative error')\n",
    "ax2.set_ylabel('Relative error')\n",
    "ax2.tick_params(axis='y')\n",
    "\n",
    "\n",
    "\n",
    "plt.title('Resolution: {}'.format(resolution))\n",
    "plt.legend()\n",
    "fig.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting forward run...\n",
      "Starting adjoint run...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.8/site-packages/meep/adjoint/filter_source.py:92: RuntimeWarning: invalid value encountered in true_divide\n",
      "  l2_err = np.sum(np.abs(H-H_hat.T)**2/np.abs(H)**2)\n",
      "/usr/local/lib/python3.8/site-packages/meep/adjoint/filter_source.py:92: RuntimeWarning: divide by zero encountered in true_divide\n",
      "  l2_err = np.sum(np.abs(H-H_hat.T)**2/np.abs(H)**2)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Calculating gradient...\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "Si = mp.Medium(index=3.4)\n",
    "SiO2 = mp.Medium(index=1.44)\n",
    "\n",
    "Sx = 6\n",
    "Sy = 5\n",
    "cell_size = mp.Vector3(Sx,Sy)\n",
    "\n",
    "pml_layers = [mp.PML(1.0)]\n",
    "\n",
    "fcen = 1/1.55\n",
    "width = 0.2\n",
    "fwidth = width * fcen\n",
    "source_center  = [-1,0,0]\n",
    "source_size    = mp.Vector3(0,2,0)\n",
    "kpoint = mp.Vector3(1,0,0)\n",
    "src = mp.GaussianSource(frequency=fcen,fwidth=fwidth)\n",
    "\n",
    "source = [mp.Source(src,component=mp.Ez,\n",
    "                    size = source_size,\n",
    "                    center=source_center)]\n",
    "\n",
    "\n",
    "design_region_resolution = 10\n",
    "\n",
    "Nx = design_region_resolution\n",
    "Ny = design_region_resolution\n",
    "\n",
    "design_variables = mp.MaterialGrid(mp.Vector3(Nx,Ny),SiO2,Si,grid_type='U_SUM')\n",
    "design_region = mpa.DesignRegion(design_variables,volume=mp.Volume(center=mp.Vector3(), size=mp.Vector3(1, 1, 0)))\n",
    "\n",
    "geometry = [\n",
    "    mp.Block(center=mp.Vector3(x=-Sx/4), material=Si, size=mp.Vector3(Sx/2, 0.5, 0)), # horizontal waveguide\n",
    "    mp.Block(center=mp.Vector3(y=Sy/4), material=Si, size=mp.Vector3(0.5, Sy/2, 0)),  # vertical waveguide\n",
    "    mp.Block(center=design_region.center, size=design_region.size, material=design_variables)]\n",
    "\n",
    "\n",
    "\n",
    "sim = mp.Simulation(cell_size=cell_size,\n",
    "                    boundary_layers=pml_layers,\n",
    "                    geometry=geometry,\n",
    "                    sources=source,\n",
    "                    eps_averaging=False,\n",
    "                    resolution=resolution)\n",
    "\n",
    "\n",
    "\n",
    "Ez = mpa.FourierFields(sim,mp.Volume(center=mp.Vector3(0,1,0),size=mp.Vector3(2,0,0)), mp.Ez)\n",
    "Hx = mpa.FourierFields(sim,mp.Volume(center=mp.Vector3(0,1,0),size=mp.Vector3(2,0,0)), mp.Hx)\n",
    "\n",
    "\n",
    "ob_list = [Hx, Ez]\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "def J1(H, E):\n",
    "    return npa.abs((6+7j)*H[1,2]+(3.4+1j)*E[0,4])**2\n",
    "\n",
    "def J2(E):\n",
    "    return npa.abs(E[0,4])**2\n",
    "\n",
    "opt = mpa.OptimizationProblem(\n",
    "    simulation=sim,\n",
    "    objective_functions=J1,\n",
    "    objective_arguments=ob_list,\n",
    "    design_regions=[design_region],\n",
    "    fcen=fcen,\n",
    "    df = 0.03,\n",
    "    nf = 3,\n",
    "    decay_fields=[mp.Ez]\n",
    ")\n",
    "\n",
    "\n",
    "\n",
    "x0 = 11*np.random.rand(Nx*Ny) + 1\n",
    "opt.update_design([x0])\n",
    "\n",
    "\n",
    "db = 1e-3\n",
    "choose = 10\n",
    "\n",
    "\n",
    "f0, dJ_deps= opt()\n",
    "g_adjoint = np.sum(dJ_deps, axis=1)\n",
    "g_discrete, idx = opt.calculate_fd_gradient(num_gradients=choose,db=db)\n",
    "g_discrete = np.array(g_discrete)\n",
    "\n",
    "\n",
    "(m, b) = np.polyfit(np.squeeze(g_discrete), g_adjoint[idx], 1)\n",
    "min_g = np.min(g_discrete)\n",
    "max_g = np.max(g_discrete)\n",
    "\n",
    "\n",
    "\n",
    "fig, ax1 = plt.subplots()\n",
    "\n",
    "ax1.plot([min_g, max_g],[min_g, max_g],label='y=x comparison')\n",
    "ax1.plot([min_g, max_g],[m*min_g+b, m*max_g+b],'--',label='Best fit m='+str(m))\n",
    "ax1.plot(g_discrete,g_adjoint[idx],'o',label='Adjoint comparison')\n",
    "ax1.set_xlabel('Finite Difference Gradient')\n",
    "ax1.set_ylabel('Adjoint Gradient')\n",
    "ax1.tick_params(axis='y')\n",
    "plt.legend()\n",
    "plt.grid(True)\n",
    "\n",
    "g_discrete = g_discrete.reshape(-1, 1)\n",
    "g_adjoint = g_adjoint.reshape(-1,1)\n",
    "ax2 = ax1.twinx()\n",
    "ax2.plot(g_discrete, np.abs((g_discrete-g_adjoint[idx])/g_discrete),'^',label='Relative error')\n",
    "ax2.set_ylabel('Relative error')\n",
    "ax2.tick_params(axis='y')\n",
    "\n",
    "plt.title('Resolution: {}'.format(resolution))\n",
    "plt.legend()\n",
    "fig.tight_layout()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
